package android.com.willienter.dados;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;

import android.com.willienter.R;
import android.content.Context;
import android.content.res.XmlResourceParser;

public class xmlParser {
	
	public xmlParser(){}
	

	public List<String[]> getunis(Context ct) throws  XmlPullParserException, IOException{
		List<String[]> listaunis = new ArrayList<String[]>();
		XmlResourceParser myxml = ct.getResources().getXml(R.xml.universidades);
		myxml.next();
    	int eventType = myxml.getEventType(); 
    	String NodeValue;
    	//Keep going until end of xml document
    	while (eventType != XmlPullParser.END_DOCUMENT){  
    	    if(eventType == XmlPullParser.START_TAG){     
    	    	//Start of a Node
    	        NodeValue = myxml.getName();
    	        if (NodeValue.equalsIgnoreCase("universidade"))
    	        {
    	        	listaunis.add(new String[]{ 
    	        		   myxml.getAttributeValue(0),
     	        		   myxml.getAttributeValue(1),
     	        		   myxml.getAttributeValue(6)});
    	        }
    	    }   
    	    
    	    //Get next event from xml parser
    	    eventType = myxml.next(); 
    	}
		return listaunis;
	}
	
	
	/////////////////////////////////////// Cursos //////////////////////////////////////
	public List<String[]> getCursos(Context ct) throws XmlPullParserException, IOException{
		//retorna o primeiro atributo de cada linha de XML de curso
		return parserGeral(ct, R.xml.curso, "curso");
	}
	
	public String[] getNomeCursos(Context ct) throws XmlPullParserException, IOException{
		//retorna o primeiro atributo de cada linha de XML de curso
		return transformaXml(parserGeral(ct, R.xml.curso, "curso"),0);
	}	
	
	public String[] getCodCursos(Context ct) throws XmlPullParserException, IOException{
		//retorna o primeiro atributo de cada linha de XML de curso
		return transformaXml(parserGeral(ct, R.xml.cursos_universidades, "curso_universidade"),0);
	}
	
	public int[] getCodCursos(Context ct, int[] codigos) throws XmlPullParserException, IOException{
		//retorna o primeiro atributo de cada linha de XML de curso
		//return transformaXml(parserGeral(ct, R.xml.curso, "curso"),1);
		return paraInt(nomeByCodigo(parserGeral(ct, R.xml.cursos_universidades, "curso_universidade"),codigos,0,2));
	}
	
	public String[] getNomeCursos(Context ct, int[] codigo) throws XmlPullParserException, IOException{
		return nomeByCodigo(parserGeral(ct, R.xml.curso, "curso"), codigo, 1,0);
	}
	
	
	/////////////////////////////////////// Universidades //////////////////////////////////////
	public List<String[]> getUniversidades(Context ct) throws XmlPullParserException, IOException{
		//retorna todas as universidades
		return parserGeral(ct, R.xml.universidades, "universidade");
	}
	
	public String[] getNomeUniversidades(Context ct, int[] codigo) throws XmlPullParserException, IOException{
		//retorna o primeiro atributo de cada linha de XML de curso
		return nomeByCodigo(parserGeral(ct, R.xml.universidades, "universidade"), codigo, 1, 0);
	}
	
	public int[] getCodUniversidades(Context ct, int[] cursos) throws XmlPullParserException, IOException{
		//retorna o primeiro atributo de cada linha de XML de curso
		return paraInt(nomeByCodigo(parserGeral(ct, R.xml.cursos_universidades, "curso_universidade"),cursos,0,2));
		//return transformaXml(parserGeral(ct, R.xml.cursos_universidades, "curso_universidade"),2);
	}

	
	/////////////////////////////////////// Exames //////////////////////////////////////
	public List<String[]> getExames(Context ct) throws XmlPullParserException, IOException{
		//retorna todas as universidades
		return parserGeral(ct, R.xml.exames, "exame");
	}
	
	/////////////////////////////////////// Gabinetes //////////////////////////////////////
	public List<String[]> getGabinetes(Context ct) throws XmlPullParserException, IOException{
		//retorna todas as universidades
		return parserGeral(ct, R.xml.gabinetes, "gabinete");
	}
	
	
	/////////////////////////////////////// Separadores //////////////////////////////////////
	public List<String[]> getSeparadorCurso(Context ct) throws XmlPullParserException, IOException{

		List<String[]> tmp = parserGeral(ct, R.xml.cursos_universidades, "curso_universidade");
		String[] codUnico = transformaXml(tmp,0);
		String[] codCurso = transformaXml(tmp,1);
		String[] universidade = transformaXml(tmp,2);
		
		//fica com o nome dos curso
		codCurso = getNomeCursos(ct, paraInt(codCurso));
		
		universidade = getNomeUniversidades(ct, paraInt(universidade));
		
		return juntaStrings(codCurso, codUnico, universidade);
	}
	
	public List<String[]> getSeparadorGabinetes(Context ct) throws XmlPullParserException, IOException{
		
		List<String[]> tmp = getGabinetes(ct);
	
		String[] cidade = transformaXml(tmp,1);
		String[] id = transformaXml(tmp,0);
		String[] morada = transformaXml(tmp,2);
		
		return juntaStrings(cidade, id, morada);
	}
	
	
	private List<String[]> parserGeral(Context ct, int xml, String tag) throws XmlPullParserException, IOException{
    		
		List<String[]> ls = new ArrayList<String[]>();
		
    	XmlResourceParser myxml = ct.getResources().getXml(xml);
    	myxml.next();
    	int eventType = myxml.getEventType(); 
    	String NodeValue;
    	
    	//Keep going until end of xml document
    	while (eventType != XmlPullParser.END_DOCUMENT){  
    		
    	    if(eventType == XmlPullParser.START_TAG){     
    	    	//Start of a Node
    	        NodeValue = myxml.getName();
    	        if (NodeValue.equalsIgnoreCase(tag)){
    	        	
    	        	String[] lista = new String[myxml.getAttributeCount()];
    	        	
    	        	for(int i=0; i<myxml.getAttributeCount(); i++){
    	        		lista[i] = myxml.getAttributeValue(i);
    	        	}
    	        	
    	        	ls.add(lista);
    	        }
    	    }   
    	    
    	    //Get next event from xml parser
    	    eventType = myxml.next(); 
    	}

    	return ls;
    }
	
	private String[] transformaXml(List<String[]> ls, int atributo){
		String[] retorno = new String[ls.size()];
		int i=0;
		
		if (!ls.isEmpty()) {
			for(String[] resultado : ls){
				retorno[i] = resultado[atributo];
				i++;
			}
		}
		  
		return retorno;
	}
	
	private String[] nomeByCodigo(List<String[]> ls, int[] codigos, int atributoTestar, int atributoRetornar){
		String[] retorno = new String[codigos.length];
		int i=0;
		
		if (!ls.isEmpty()) {
			for(String[] resultado : ls){
				for(int j=0; j<codigos.length; j++){
					if(codigos[j] == Integer.parseInt(resultado[atributoTestar])){
						retorno[i] = resultado[atributoRetornar];
						i++;
					}
				}
			}
		}
		  
		return retorno;
	}

	public int[] paraInt(String[] array){
		
		int[] retorno = new int[array.length];
		
		for(int i=0; i<array.length; i++){
			retorno[i] = Integer.parseInt(array[i]);
		}
		return retorno;
	}
	
	private List<String[]> juntaStrings(String[] codCurso, String[] codUnico, String[] univ){
		
		List<String[]> retorno = new ArrayList<String[]>();
		
		for(int i=0; i<codUnico.length; i++){
			retorno.add(new String[]{codCurso[i], codUnico[i], univ[i]});
		}
		
		return retorno;
	}
	
}
